home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / graphics / gnuplot / term / emxvga.trm < prev    next >
Text File  |  1993-05-11  |  4KB  |  234 lines

  1. /* GNUPLOT - emxvga.trm */
  2. /*
  3.  * Copyright (C) 1993
  4.  *
  5.  * Permission to use, copy, and distribute this software and its
  6.  * documentation for any purpose with or without fee is hereby granted, 
  7.  * provided that the above copyright notice appear in all copies and 
  8.  * that both that copyright notice and this permission notice appear 
  9.  * in supporting documentation.
  10.  *
  11.  * Permission to modify the software is granted, but not the right to
  12.  * distribute the modified code.  Modifications are to be distributed 
  13.  * as patches to released version.
  14.  *
  15.  * This software  is provided "as is" without express or implied warranty.
  16.  *
  17.  * This file is included by ../term.c.
  18.  *
  19.  * This terminal driver supports:
  20.  *  vgal
  21.  *  vesa
  22.  *
  23.  * AUTHORS
  24.  *  Russell Lang
  25.  *
  26.  * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
  27.  *
  28.  */
  29.  
  30. /* VGA driver using EMX/GCC for DOS */
  31. #include <graph.h>
  32. #include <conio.h>
  33. #include <dos.h>
  34.  
  35. int emx_startx, emx_starty;
  36. int emx_xlast, emx_ylast;
  37. int emx_color;
  38. int emx_angle;
  39. int emx_vmode = 0;
  40. #ifdef EMXVESA
  41. int emx_vesamode = G640x480x256;
  42. #endif
  43.  
  44. #define EMXVGA_XMAX 640
  45. #define EMXVGA_YMAX 480
  46.  
  47. #define EMXVGA_XLAST (EMXVGA_XMAX - 1)
  48. #define EMXVGA_YLAST (EMXVGA_YMAX - 1)
  49.  
  50. #define EMXVGA_VCHAR FNT5X9_VCHAR
  51. #define EMXVGA_HCHAR FNT5X9_HCHAR
  52. #define EMXVGA_VTIC 4
  53. #define EMXVGA_HTIC 4
  54.  
  55. #define EMXNUMCOLOR 15
  56. static int emx_colors[EMXNUMCOLOR] = {7,8,2,3,4,5,9,14,12,15,13,10,11,1,6};
  57.  
  58.  
  59. EMXVGA_init()
  60. {
  61. union REGS r;
  62.     r.h.ah = 0x0f;
  63.     _int86(0x10, &r, &r);
  64.     emx_vmode = r.h.al;    /* save old video mode */
  65.     /* Get the screen size: */
  66.     if (!g_mode(G_MODE_VGA_L))
  67.         int_error("Couldn't select graphics mode",NO_CARET);
  68.     emx_xlast = g_xsize - 1;
  69.         term_tbl[term].xmax = emx_xlast + 1;
  70.     emx_ylast = g_ysize - 1;
  71.         term_tbl[term].ymax = emx_ylast + 1;
  72.     g_mode(G_MODE_OFF);
  73. }
  74.  
  75. EMXVGA_graphics()
  76. {
  77. /* don't use g_mode() here - gmode(G_MODE_OFF) doesn't clean up */
  78. union REGS r;
  79.     r.h.ah = 0x00;
  80.     r.h.al = 19;        /* VGA 320x200x256 mode */
  81.     _int86(0x10, &r, &r);
  82. }
  83.  
  84. EMXVGA_text()
  85. {
  86. /* don't use g_mode() here - gmode(G_MODE_OFF) doesn't clean up */
  87. union REGS r;
  88. int ch;
  89.     ch = getch();
  90.     r.h.ah = 0x00;
  91.     r.h.al = emx_vmode;    /* old video mode */
  92.     _int86(0x10, &r, &r);
  93.     if (ch == 3)
  94.         int_error("Interrupt",NO_CARET);
  95. }
  96.  
  97. EMXVGA_reset()
  98. {
  99. }
  100.  
  101. #ifdef EMXVESA
  102. /* untested */
  103. EMXVESA_options()
  104. {
  105.     extern struct value *const_express();
  106.     extern double real();
  107.  
  108.     if (!END_OF_COMMAND) {
  109.         if (almost_equals(c_token,"d$efault")) {
  110.             emx_vesamode = G640x480x256;
  111.             c_token++;
  112.         }
  113.     }
  114.  
  115.     if (!END_OF_COMMAND) {
  116.         /* We have a vesa mode specified */
  117.         struct value a;
  118.         emx_vesamode = (int)real(const_express(&a));
  119.     }
  120.  
  121.     sprintf(term_options,"%d",emx_vesamode);
  122. }
  123.  
  124. EMXVESA_init()
  125. {
  126.     if (!g_mode(emx_vesamode))
  127.         int_error("Couldn't select graphics mode",NO_CARET);
  128.     emx_xlast = g_xsize - 1;
  129.         term_tbl[term].xmax = emx_xlast + 1;
  130.     emx_ylast = g_ysize - 1;
  131.         term_tbl[term].ymax = emx_ylast + 1;
  132.     g_mode(GTEXT);
  133. }
  134.  
  135. EMXVESA_graphics()
  136. {
  137.     g_mode(emx_vesamode);
  138. }
  139.  
  140. EMXVESA_text()
  141. {
  142. int ch;
  143.     ch = getch();
  144.     g_mode(GTEXT);
  145.     if (ch == 3)
  146.         int_error("Interrupt",NO_CARET);
  147. }
  148.  
  149. EMXVESA_reset()
  150. {
  151. }
  152. #endif
  153.  
  154.  
  155. EMXVGA_linetype(linetype)
  156. int linetype;
  157. {
  158.     if (linetype >= 13)
  159.         linetype %= 13;
  160.     emx_color = emx_colors[linetype+2];
  161. }
  162.  
  163. EMXVGA_move(x,y)
  164. unsigned int x,y;
  165. {
  166.     emx_startx = x;
  167.     emx_starty = y;
  168. }
  169.  
  170.  
  171. EMXVGA_vector(x,y)
  172. unsigned int x,y;
  173. {
  174.     g_line(emx_startx,emx_ylast-emx_starty,x,emx_ylast-y,emx_color);
  175.     emx_startx = x;
  176.     emx_starty = y;
  177. }
  178.  
  179.  
  180. int EMXVGA_text_angle(ang)
  181. int ang;
  182. {
  183.     emx_angle=ang;
  184.     return TRUE;
  185. }
  186.  
  187.  
  188. EMXVGA_putc(x,y,c,angle)
  189. unsigned int x,y;
  190. char c;
  191. int angle;
  192. {
  193. int i,j,k;
  194. unsigned int pixelon;
  195.     i = (int)(c) - 32;
  196.     for (j=0; j<FNT5X9_VBITS; j++) {
  197.         for (k=0; k<FNT5X9_HBITS; k++) {
  198.             pixelon = (((unsigned int)(fnt5x9[i][j])) >> k & 1);
  199.             if (pixelon) {
  200.                 switch(angle) {
  201.                     case 0 : g_set(x+k,y-j,emx_color);
  202.                             break;
  203.                     case 1 : g_set(x-j,y-k,emx_color);
  204.                             break;
  205.                 }
  206.             }
  207.         }
  208.     }
  209. }
  210.  
  211.  
  212. EMXVGA_put_text(x,y,str)
  213. unsigned int x, y;
  214. char *str;
  215. {
  216. int i;
  217.     switch(emx_angle) {
  218.         case 0 : y -= EMXVGA_VCHAR/2;
  219.                 break;
  220.         case 1 : x += EMXVGA_VCHAR/2;
  221.                 break;
  222.     }
  223.     for (i=0;str[i];i++) {
  224.         EMXVGA_putc(x,emx_ylast-y,str[i],emx_angle);
  225.         switch(emx_angle) {
  226.             case 0 : x+=EMXVGA_HCHAR ;
  227.                     break;
  228.             case 1 : y+=EMXVGA_HCHAR ;
  229.                     break;
  230.         }
  231.     }
  232. }
  233.  
  234.